package JavaCode.random_records.N501_600;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * author:fangjie
 * time:2019/10/31
 */
public class N514_freedom_trail {
    public int findRotateSteps(String ring, String key) {
        char[] rings=ring.toCharArray();
        List<Integer>[] rs=new List[26];
        for (int i=0;i<26;i++)rs[i]=new ArrayList<>();
        for (int i=0;i<rings.length;i++) rs[rings[i]-'a'].add(i);
        char[] keys=key.toCharArray();

        int[][] dp=new int[ring.length()+1][key.length()+1];
        for (int i=0;i<dp.length;i++) Arrays.fill(dp[i],-1);

        return slove(0,0,keys,rs,dp,ring.length());
    }

    private final static int MAX=Integer.MAX_VALUE>>1;
    private int slove(int r_idx, int k_idx, char[] keys, List<Integer>[] rs, int[][] dp,final int rlen) {
        if(k_idx==keys.length)return 0;
        if(dp[r_idx][k_idx]!=-1)return dp[r_idx][k_idx];
        int res=MAX;
        for (int i:rs[keys[k_idx]-'a'])
        {
            int t=1+Math.min(Math.abs(r_idx-i),Math.min(Math.abs(i+rlen-r_idx),Math.abs(r_idx+rlen-i)));
            t+=slove(i,k_idx+1,keys,rs,dp,rlen);
            res=Math.min(res,t);
        }
        return dp[r_idx][k_idx]=res;
    }
}
/*
视频游戏“辐射4”中，任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘，并使用表盘拼写特定关键词才能开门。

给定一个字符串 ring，表示刻在外环上的编码；给定另一个字符串 key，表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。

最初，ring 的第一个字符与12:00方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐，然后按下中心按钮，以此逐个拼写完 key 中的所有字符。

旋转 ring 拼出 key 字符 key[i] 的阶段中：

您可以将 ring 顺时针或逆时针旋转一个位置，计为1步。旋转的最终目的是将字符串 ring 的一个字符与 12:00 方向对齐，并且这个字符必须等于字符 key[i] 。
如果字符 key[i] 已经对齐到12:00方向，您需要按下中心按钮进行拼写，这也将算作 1 步。按完之后，您可以开始拼写 key 的下一个字符（下一阶段）, 直至完成所有拼写。
示例：

 


 
输入: ring = "godding", key = "gd"
输出: 4
解释:
 对于 key 的第一个字符 'g'，已经在正确的位置, 我们只需要1步来拼写这个字符。
 对于 key 的第二个字符 'd'，我们需要逆时针旋转 ring "godding" 2步使它变成 "ddinggo"。
 当然, 我们还需要1步进行拼写。
 因此最终的输出是 4。
提示：

ring 和 key 的字符串长度取值范围均为 1 至 100；
两个字符串中都只有小写字符，并且均可能存在重复字符；
字符串 key 一定可以由字符串 ring 旋转拼出。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/freedom-trail
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
